package flyweighgt_pattern.ex2;

import java.util.EnumMap;
import java.util.Map;

/**
 * @author 申书航
 * @version 1.0
 *
 * PotionFactory 是一个享元工厂类，负责管理和创建不同类型的药水对象。
 * 它采用单例模式，以确保全局只有一个实例。
 */
public class PotionFactory {
    // 存储已创建的药水对象，键为药水类型，值为药水实例
    private final Map<PotionType, Potion> potions;
    private static PotionFactory instance = new PotionFactory(); // 单例实例

    // 私有构造函数，初始化药水映射
    private PotionFactory() {
        potions = new EnumMap<>(PotionType.class); // 使用 EnumMap 存储药水
    }

    // 获取单例实例的方法
    public static PotionFactory getInstance() {
        return instance;
    }

    /**
     * 根据给定的药水类型获取药水实例。
     * 如果不存在对应类型的药水实例，则创建新的实例并缓存起来。
     * @param type 药水类型
     * @return 药水实例
     */
    Potion getPotion(PotionType type) {
        Potion potion = potions.get(type); // 尝试从缓存中获取药水实例
        if (potion == null) { // 如果不存在，则创建新的实例
            switch (type) {
                case HEALING:
                    potion = new HealingPotion(); // 创建治疗药水实例
                    break;
                case STRONG:
                    potion = new StrongPotion(); // 创建强力药水实例
                    break;
                case HOLY_WATER:
                    potion = new HolyWaterPotion(); // 创建圣水药水实例
                    break;
                case INVISIBILITY:
                    potion = new InvisibilityPotion(); // 创建隐形药水实例
                    break;
                default:
                    break;
            }
            potions.put(type, potion); // 将新创建的实例缓存起来
        }
        return potion; // 返回药水实例
    }
}
